//
//  DataBaseManager.m
//  Koala_Fm
//
//  Created by dllo on 16/2/25.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import "DataBaseManager.h"

@implementation DataBaseManager
+(DataBaseManager *)shareInstance{
    // 静态指针变量 保证指针只有一个
    static DataBaseManager *dbmanager = nil;
    
    // 是否是第一次调用该方法
    // 如果指针中为空 创建对象
    if (!dbmanager) {
        // 单例中的alloc不需要release
        dbmanager = [[DataBaseManager alloc]init];
    }
    // 如果指针不为空 直接返回
    return dbmanager;

}

// 打开数据库
- (void)open{
    // 数据库一般放在Documents下
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"suibian.db"];
    // 创建数据库文件
    // 判断dbPoint指针中 是否存在数据库指针 如果不存在 在创建
    // 参数1: 数据库路径(UTF8 转码)
    // 参数2: 数据库指针地址
    int result = sqlite3_open(path.UTF8String, &dbPoint);
    NSLog(@"打开数据库: %d, 路径: %@", result, path);
}
// 关闭数据库
- (void)close{
    
    sqlite3_close(dbPoint);
    
    
}
// 创建表
- (void)create{
    // 创建1.SOL语句
    // exists 存在
    // text 字符串
    // integer 整数
    // primary key 主键
    // autoincrement 自动增加
    NSString *createSOL = @"CREATE TABLE IF NOT EXISTS listen(listenName text, pubdate text, listenId integer PRIMARY KEY AUTOINCREMENT)";
    // 2.执行语句
    // 参数1: 数据库指针
    // 参数2: sql语句
    int result = sqlite3_exec(dbPoint, createSOL.UTF8String,NULL, NULL, NULL);
    // 3. 判断
    if (result == SQLITE_OK) {
        NSLog(@"创建表成功");
    }else {
        NSLog(@"失败: %d", result);
    }
}
// 删除表
- (void)drop{
    //1.SOL
    NSString *drop = @"DROP TABLE listen";
    //2.执行
    int result = sqlite3_exec(dbPoint, drop.UTF8String, NULL, NULL, NULL);
    //3.判断
    [self judgeResult:result message:@"删除表"];
}

// 判断方法
// 参数1: 判断的数值
// 参数2: 打印的信息
- (void)judgeResult:(int)r message:(NSString *)mes{
    
    if (r == SQLITE_OK) {
        NSLog(@"%@成功", mes);
    }else{
        NSLog(@"%@失败: %d",mes, r );
    }
}
// 增
- (void)insert:(Read *)listen{
    //1.SOL
    NSString *insertSOL = [NSString stringWithFormat:@"INSERT INTO listen (listenName, pubdate) values('%@', '%@')", listen.listenName, listen.pubdate];
    //2.执行
    int result = sqlite3_exec(dbPoint, insertSOL.UTF8String,NULL , NULL, NULL);
    //3.判断
    [self judgeResult:result message:@"插入数据"];
}
// 删
- (void)deleteMovieWithName:(Read *)listenName{
    
    //1.SOL
    NSString *deleteSOL = [NSString stringWithFormat:@"DELETE FROM listen WHERE listenName = '%@'", listenName.listenName];
    // 2
    int result = sqlite3_exec(dbPoint, deleteSOL.UTF8String, NULL,NULL , NULL);
    //3
    [self judgeResult:result message:@"删除数据"];
    
    
}
// 查
- (NSMutableArray *)select{
    // 查询后 数据处理过程
    // 1.获取到所有的数据
    // 2.先遍历行 得到每一条数据
    // 3.在遍历当前行的 每一列 按照对应关系保存在model中
    // 4.model添加到数组 返回
    //1
    NSString *selectSOL = @"SELECT * FROM listen";
    //2.创建数据库替身
    sqlite3_stmt *stmt = nil;
    //3.准备SOL语句
    // prepare_v2函数 把 数据库对象/SOL语句/数据库替身 关联在一起
    int result = sqlite3_prepare_v2(dbPoint, selectSOL.UTF8String,-1 ,&stmt , nil);
    // 4.初始化返回的数据
    NSMutableArray *arr = [NSMutableArray array];
    //5.判断准备是否成功
    if (result == SQLITE_OK) {
        NSLog(@"查询准备成功");
        //6.遍历每一行数据
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            // 逐行 获取每一列信息
            // 列数 从0开始
            const unsigned char *mName = sqlite3_column_text(stmt, 0);
            const unsigned char *pubdate = sqlite3_column_text(stmt, 1);
            int mId = sqlite3_column_int(stmt, 2);
            // 创建model
            Read *m = [[Read alloc]init];
            m.listenName = [NSString stringWithUTF8String:(const char *)mName];
            m.pubdate = [NSString stringWithUTF8String:(const char *) pubdate];
            m.listenId = mId;
            // 添加到数组
            [arr addObject:m];
        }
    }else{
        NSLog(@"失败: %d", result);
    }
    // 释放替身
    sqlite3_finalize(stmt);
    // 返回数据
    return arr;
}






@end
